P4054 计数问题
题目描述
一个
-
改变一个格子的权值;
-
求一个子矩阵中某种特定权值出现的个数。
输入格式
第一行有两个数
接下来
接下来输入一个整数
之后
操作 1:输入一行四个整数
操作 2:输入一行六个整数
输出格式
对于每个操作 2,按照在输入中出现的顺序,依次输出一行一个整数表示所求得的个数。
满足:
对于操作 1,保证:
对于操作 2,保证:
Solution
二维树状数组
#define lowbit(x) x&(-x)
int a[310][310], n, m, c[310][310][110];
void add(int x, int y, int k, int color) {
for (int i = x;i <= n;i += lowbit(i)) {
for (int j = y;j <= m;j += lowbit(j)) {
c[i][j][color] += k;
}
}
}
int query(int x, int y, int color) {
int ans = 0;
for (int i = x;i;i -= lowbit(i)) {
for (int j = y;j;j -= lowbit(j)) {
ans += c[i][j][color];
}
}
return ans;
}
void solve() {
cin >> n >> m;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
int x;cin >> x;
a[i][j] = x;
add(i, j, 1, x);
}
}
int q;cin >> q;
while (q--) {
int op;cin >> op;
if (op == 1) {
int x, y, c;cin >> x >> y >> c;
add(x, y, -1, a[x][y]);
a[x][y] = c;
add(x, y, 1, c);
} else {
int x1, x2, y1, y2, c;cin >> x1 >> x2 >> y1 >> y2 >> c;
cout <<
query(x2, y2, c) - query(x1 - 1, y2, c) - query(x2, y1 - 1, c) + query(x1 - 1, y1 - 1, c)
<< '\n';
}
}
}